package main

import (
	"fmt"
	"os"
)

func main() {
	// Printf函数：用于将格式化的字符串输出到标准输出（通常是控制台），不返回任何值。例如：
	str := "golang 你好"
	fmt.Println(str, len(str), str[1])
	fmt.Printf("值的默认格式:%v \n", str[1]) // 原值输出
	fmt.Printf("值的类型:%T \n", str[1])   // 值的类型
	fmt.Printf("该值对应的unicode码值:%c \n", str[1])
	fmt.Printf("直接输出字符串:%s \n", str[1]) // 会提示： %!s(uint8=111) ，不是字符串
	fmt.Printf("该值对应的单引号括起来:%q \n", str[1])
	fmt.Printf("表示为十六进制:%X \n", str[1])
	fmt.Printf("表示为十六进制（小写）:%x \n", str[1])
	fmt.Printf("表示为二进制:%b \n", str[1])
	fmt.Printf("表示为8进制：%o \n", str[1])                 //
	fmt.Printf("表示为十进制: %d \n", str[1])                // 表示为十六进制，使用A-F
	fmt.Printf("宽度9，精度20: %9.20f \n", 12.2)            // 表示为十六进制，使用A-F
	fmt.Printf("表示为Unicode格式（U+1234) :%U \n", 'a')     // 表示为Unicode格式：U+1234
	fmt.Printf("单词true或false:%t \n", 1 == 1)           // 单词true或false
	fmt.Printf("指定第n个参数：%[2]d %[1]d %d\n", 11, 22, 33) // 除非另有指示，会接着处理参数n+1，n+2……（就是说移动了当前处理位置
	fmt.Println("---------------------------")
	// Sprintf函数：用于将格式化的字符串保存到一个字符串变量中，而不是输出到标准输出
	var n1 int = 19
	var n2 float32 = 4.78
	var n3 bool = false
	var n4 byte = 'a'
	var s1 string = fmt.Sprintf("%d", n1)
	var s2 string = fmt.Sprintf("%f", n2)
	var s3 string = fmt.Sprintf("%t", n3)
	var s4 string = fmt.Sprintf("%c", n4)
	fmt.Printf("类型是：%T %T %T %T ，value = %q %q %q %q\n", s1, s2, s3, s4, s1, s2, s3, s4)
	//Fprintf函数：用于将格式化的字符串输出到指定的io.Writer接口（比如文件、网络连接等），而不是输出到标准输出。返回写入的字节数和可能的错误。
	file, _ := os.Create("output.txt")
	defer file.Close()
	fmt.Fprintf(file, "Hello, %s!\n", "world")

}
